I assume you know the old trick used by static binary translators to provide a label for each basic block and then jumping to it via the && gcc extension that takes the address of a label (using a table to map machine instruction addresses to label addresses)? This won't result in nicely readable C code but it should work.
See Smith/Nair's "Virtual Machines" section 2.3.2 "Direct Threaded Interpretation" for an example.