The SPC700's instruction set is derived from the 6502's, but moves the instructions around and adds a few. But is it fully backwards compatible?
No.
At least not fully. The instruction set is mostly like a 65C02, but a few instructions (like BIT) are missing. Also, not all inner workings are the same (*1).
Assuming that the program fully separates data and code, such that opcodes are never used as data or operands, can a direct binary to binary transliteration be performed that leaves the SPC700 program operating identically to the 6502 version without changing any of the addresses of instructions?
With some luck. For example if there's none of the missing instructions used (*2). And no decimal arithmetics - as the SPC700 doesn't offer that (*3). Similar direct manipulations of flags may be problemetic, as structure and meanings differs (*4).
It might be a bit better when translating source code, but not much.
*1 - No decimal mode but Half Carry handling; moveable ZP, and more
*2 - Which could be detected by the translator
*3 - Harder to detect, but CLD
/SED
could throw a warning
*4 - Here it gets hard to manage, since a warning for every PLP
would just flood the conversion listing.