Hello Bob,
Hmm... Let's make sure that I got that correctly: By "complex surface" you mean polysurface, i.e. multiple joined and possibly trimmed surfaces?
We've done quite a few milling projects with "native" Grasshopper, and while it is totally possible to create your own surfacing and roughening (usually more difficult) code, it's quite tedious and slow, as regular milling software also takes a few seconds to minutes to calculate toolpaths.
From my experience - if you don't mind the slight loss in resolution it's easier to deal with one mesh, rather than many (trimmed) surfaces. At the end you end up with polylines anyway, so using meshes instead of NURBS isn't that bad.
So if you e.g. want to mill hundreds of similar objects it makes sense to code it yourself in GH, otherwise (e.g. for single objects that you want to mill) I would recommend to use CAM software to generate the toolpaths and then turn it into robot code through PRC. Natively we support SprutCAM (which is also free for universities and students) but it should work with most CAM code.
It's a feature of the member version, but I can issue you a temporary license!
All the best,
Johannes @ Robots in Architecture