There are two big problems with static recompilation: 1) dynamic code (self-modifying programs as well as programs that copy or load code into RAM), and 2) timing. For some systems, timing and synchronization might not be important, but for many old consoles and arcades, they are. Dynamically loaded code means you may have to lug the translator itself around in the binaries you produce because it is virtually impossible to detect this kind of stuff at compile-time.