If you've actually used ROMs as logic in practice, then you've probably also run across their main drawback: glitches in the outputs when an input changes. If you're circuit is synchronized this isn't an issue, but for pure logic without synchronization, it is potentially a major problem.
So when I ran across a homebrew computer that claimed to be built entirely with ROMs, I was really curious how this might have been done. About a third of the way into the web page, I ran across this:
Some observations have led me to assume that when the address input changes from a value A to a value B, even if the same value X is memorized in all the addresses in T(A,B), a transient state can appear on the data outputs during a few nano seconds. This transient phenomenon can be enough to “break” the storage loop. I worked around this problem by putting a 1nf capacitor on each data output of the EPROMs used to implements registers. This solution gives no guarantee of reproducibility. It could be improved by using resistor capacitor circuits in the storage loop instead of single capacitors. Without this hack, the computer crashes after running a few tens of thousands of instructions.Well, that's about as hacky as you can get! Basically he's using capacitors as a sort of low-pass filter to keep the transients from affecting his ROM logic. One would never engineer something for production like that, as the necessary values for those capacitors would be affected by all sorts of things, from ambient temperature to which production run of ROMs was being used.
Still ... having a computer built entirely from logic implemented in ROMs is pretty cool! :)