That's not a dumb question at all. The answer is simple: by cramming for logic in between registers. Since you (or at least the tools) are in complete control of the routing, you can place as much logic as you would like between registers, thus accomplishing everything in one clock cycle. The trade-off, however, is that every level of logic adds delay to the path and you can't clock your registers any faster than the sum of all the delays allows (with some exceptions).
This simple diagram sort of demonstrates the concept:
This simple diagram sort of demonstrates the concept:
http://m.eet.com/media/1176731/sync-vs-async-01.gif