Writing closed loop code is more complicated than how fast the Brain might or LPT might be. When you are comparing fast signals its not only important to be able to read them fast but you have to read them consistently (meaning the same time delay between each loop, i.e. hard real time). You are always dealing with signals after the fact, that is after the event already occurred. If your LPT (your encoder signals) latches with a different/inconsistent time delay and/or the DRO signals have an inconsistent time of update than the information garnered would not be very accurate. As I understand it Mach runs in a quasi hard real time, using a hardware timer on the mobo. This works great 99.999% of the time, but things can decide to grab large amounts of processor time (like stupid QuickTime services) and then Mach can/will loose steps. EMC works differently, they use a Real Time kernel extension that gives EMC top billing over everything else.
With external stepper/servo controllers (Galil, NCpod, G100) you get the best of both worlds. You have a hardware driver whose only job is to control the motor (the loop is closed in the drivers) and that leaves the whole PC available to Mach to calculate the next moves to be taken, update the display, and monitor the keyboard (etc).