The problem came up with someone trying to get the voice dialing working. Basicly the software is looking for specific hardware.
Lets use this example. Lets say you have a game that requires a Pentium CPU, but you have a 486.
The software might load, but when you try run it, its going to look for specific things the hardware can do. The software was designed to look for a specific CPU in this case. Its not a matter of it just running slower, its going to look for a CPU with a code of 1234 for example. If you try running it on a CPU with a code of 5678, its going to say wrong CPU.
Why can't the compass work on the 3G then also? Because it doesn't have the hardware.
Now, maybe is it possible to write something like a Mobilesubsrate plugin that lies to the OS and tells it "This is a CPU your looking for" Give it the ole Jedi mind trick.

I think that would be worth taking a look at by someone who knows how to do it.
Apple, knows about jailbreaking, they are not going to make it that easy to enable it. They wrote the 3G S features to look for the 3G S hardware.