Yes, you can use R13-R15 for anything that you want in your generated ASM code. They are what you should use for RET and FRAME.
You should not use R13-R15 for temporary variables across multiple VM commands. For example "function" VM command must not store something in a temporary variable that the "return" command needs to use. That variable would be overwritten if the function called called another function.
One thing that you can do using R13-R15 is
Assembly Language Functions. Pick one of the registers to be your return pointer.
@$RIP_123
D=A
@$DO_XXX
0;JMP
($RIP_123)
Then $DO_XXX can contain the long ASM implementation for a VM command.
($DO_XXX)
@R15 // save RIP
M=D
// the long asm code for XXX commands goes here
@R15
0;JMP // go back to caller
This way if XXX comands require something like 15 instructions and there are 100 XXX commands in the program, it will only take 4*100 + (15+4) ASM instructions instead of 1500.
This can be especially effective for "call" commands which are quite long. (But get your calls working in-line before adding this commplication. You don't need to do this optimization for the nand2tetris projects.)
--Mark