For instance, Object Pascal uses the module approach, except that logically the file is divided into "interface" and "implementation". It has no preprocessor of any real worth (but that doesn't seem to hurt the language much), and is lightning fast. If you are fixing syntax errors, it's quicker to simply hit ctrl-f9 in the delphi IDE to recompile than move your hands from the keyboard to the mouse and back again to move to the next bug.
Part of the reason it can be so quick, is that (a) Borland make very fast compilers and (b) the Object Pascal language is conducive to fast compiles. The built in dependency tracking usually works very well - there are no Makefiles, it (spew) Just Works.
There are limitations of course. You cannot tie the interfaces of two units to each other (ie if you declare class A in unit UA.pas and class B in UB.pas you cannot have class B have a class A as a member and also vice-versa). That's a "circular unit reference" and is illegal. It can be very annoying at times, but typically if that occurs it reflects some problem in the design of your code anyway, so might as well do some refactoring while you are there.