GRBL is a very interesting program which is "logically" similar to a USB motion controller - you send it Gcode and it generates pulses and feeds back a load of control info for example the current axes positions, status etc. Works on basic Arduino but can work better on higher spec versions. There's also something optimised for lathes. I use grbl for driving my big mill's X axis and a rotary axis though I use Mach3 on a dedicated smaller CNC mill. There are limitations, I don't think all gcodes are supported, and last time I looked I don't think backlash compensation is either.

The snag with grbl is that it needs a front end to provide a UI, load and stream gcode and all the stuff that we are familiar with from Mach 3/4. It would be great if there was a Mach plugin for grbl but since the latter is open source maybe NFS don't want to open their API spec. There are various front ends - I use something called grbl controller that runs on my phone with a Bluetooth connection but it's very basic though I can jog the machine and run gcode programs. There are others but to me they looked more like programmers' ideas of CNC rather than machinists' - I may be doing them a disservice.