I did an industrial project 5 years ago with the same control model as you are describing. I am by trade an industrial controls/mechanical engineer and I was contacted by a medical company seeking to automate the production of one of their products. After evaluation of the system requirements it was clear that one aspect of the system would need a CNC controller to run a 4 axis ultrasonic cutter while the bulk of the machine would require standard PLC controller elements. In addition to the CNC cutter section, the machine has 4 servo driven custom conveyors, a heat press laminator, various air cylinders, and a PID temp controlled 10KW heater platen. It also uses an overhead projector that loads recipe driven images to direct the machine operator where to locate the raw materials on a circulating pallet.
The single most important requirement of the customer was that they wanted a machine that would be simple to operate so that the training to run the machine would be minimal.
I reached out to this forum to help me understand what would be the best method to "blend" traditional industrial controls (PLCs, VFDs, HMIs, sensors, etc.) with LinuxCNC. Eventually, I landed on using Python as a "bridge" between LinuxCNC and the PLC/HMI. Python has an excellent and stable module called pymodbusTCP. With that module, python can reliably talk to virtually any industrial PLC or device that speaks modbus. The second module that makes it all work is the python linuxCNC module. It talks to a running instance of LinuxCNC and can get status information and it can command LinuxCNC . Using this custom python script that I wrote the system works without the machine operator having any knowledge of how to run a CNC machine or any G code whatsoever. When the system starts up, the python software bridge homes the CNC system and checks it for ready status. The operator simply selects which product code to run via the HMI. From there, the PLC tag with the product code is read by python through ModbusTCP. Then, the correct G-Code file for that cut pattern is automatically loaded into LinuxCNC. When the product leaves the laminator and arrives at the CNC cutter the PLC sets a bit that python reads. Python then tells LinuxCNC to run the G-Code file and it cuts the parts out. When LinuxCNC completes the cut cycle python gets the complete status bit and then it sets a bit in the PLC that lets the PLC know it's time to move the pallet to the next station. The operator has zero direct interaction with LinuxCNC. This system has been running now for over 4 years and it runs every day producing thousands and thousands of parts. The customer is totally satisfied with the machine and they are now starting to talk to me about the need for a second one. Based on my experience, blending LinuxCNC with standard industrial controls methods and devices is an excellent way to achieve advanced machine control systems. I would highly recommend using Mesa Ethernet cards to offload the pulse generation from your LinuxCNC installation. The Mesa card I installed on this system has been flawless.
Edit: Modbus (TCP) may not be the most "modern" approach that is available but I would say that it is the most universal, well understood, and common Industrial protocol. When it comes to system support it would be hard to argue against Modbus just because so many industrial control techs know it and use it. Simple system architecture typically translates to reliability. In an industrial application, reliability is king.