The signatures must be different not only because of network exceptions but moreso because the they use different calling conventions. Remote calls use "pass-by-value" while local calls use "pass-by-reference." A bean written with local semantics cannot work remotely, even if the remote interface has the exact same signature as the local interface.
Having said that, most appservers will happily "convert" remote calls to local ones if both the client & the server are within the same JVM. So even if you program solely to the remote interface, you get the performance of local calls, while still having the option of moving each side to a different JVM. It's the best of both worlds.
While this conversion contravenes the J2EE spec, you can get a huge performance
boost using this feature if you're mindful not to (accidentally) depend on pass-by-reference semantics. Older appservers enabled this optimization by default, while on newer ones you must turn it on explicitly.
-Ade Barkah