Flushing the pipeline is a problem when using a exception based approach (which isn't entirely possible) - you're talking about emulation. Plus, there are more efficient ways to emulate without huge lookup tables.
The only way you'd really get the most out of a CF would be to combine all these methods and let the task scheduler choose the appropriate one based on a database: all unknown tasks run through a JIT compiler (lowest speed), some known tasks are patched during load time and flagged as CF compatible (full speed).
This would add a tiny bit overhead to the scheduler, but permit 'clean' software to run full speed. You can even start out JITing everything and add patches later through updates.
After all, it's not impossible, but may not be worth the while.