As a general rule, if somebody hands you a machine code binary, you can have an extremely (Turing!) hard time determining which bytes in are instructions, and which are code. If you can't get that right, you can't even find the RDTSC instructions to patch out. (Worse: some programs generate code; now stuff in data areas are runtime might ephemerally contain RDTSC). In really peculiar programs, some instructions might literally overlap others, leading to some JMPs literally landing in the middle of what is identified as a long instruction. (x86 instructions can be something like 16 bytes long!).
The binary reverse engineering guys have this problem. In general, I don't know how they succeed. I suspect it is because most program object code is generated by compilers that aren't trying to hide anything (watch out when you meet a compiler that does).
If you could find them, I assume you'd replace them by a function call to a routine that loaded a known constant into the registers to avoid your suggested inconsistency problem. Patching their locations might be pretty awkward; RDTSC is (I think) 2 bytes, and they might be sandwiched between two other instructions that can't be moved for some reason. So you might be forced to use just a breakpoint (1 byte) on each RDTSC to trap out to an RDTSC simulator; this creates possibly a performance problem if somebody
is using RDTSC to read nanosecond clock ticks in a timing loop.
All in all, this seems like a hard road to take. How badly do you want to run really old programs, and why?