If this relates to a Marlin setting that has changed, you need someone with intimate knowledge of Marlin and perhaps an understanding of how Marlin has changed over time. Let’s see if @Jeffbe3 has some idea(s).
Note that the things you’ve tried, especially running the g-code off an SD card, have eliminated several potential sources of the issue. I have two ideas of what might be going on…more driven by my playing with Arduino boards than anything I’ve seen with the MPCNC. The first is that you are needing g-code to be handled faster than Marlin on the 8-bit microprocessor can process it. The second idea is that you are running into a timeout issue of some sort.
If this was my issue, I’d author a cut of a square, a large circle, and a curve. I’d unplug all unnecessary electronics including end stops and the USB connection, and I’d run the specified cuts at different feedrates off of an SD card. If the problem occurs regularly at different feedrates and/or for different kinds of shapes, then it suggests to some sort of timeout issue. If it varies with the type of cut and/or the feedrate, then it suggests a throughput issue.
Note that throughput issues can be mitigated in many CAM programs. G-code cuts curves by breaking the curve into line segments, and there is a tolerance that determines the length of those line segments. The looser the tolerance, the less line segments are generated for a given curve. Looking at your g-code I doubt this is the issue, but I’m not sure. I calculated of a few line segments that were sketching the curve, and they were around 1.5mm which doesn’t seem overly tight to me.
I don’t know what CAD/CAM program you are using to generate your g-code, but do see a serious issue in your g-code. I don’t think it has anything to do with the jittering issue. Your feedrate is too fast for the lead screw on the Z axis. Most Z feedrate limits I see for the MPCNC are around 500mm/min. Take a look at these three lines:
G1 F2942
G28 R30 X Y
G1 X0 Y0 Z47
You are attempting to move Z at nearly 3000 mm/min.
During most of the “cutting” moves, your Z feedrate matches your XY feedrate of “only” 1597mm/min, which is still 3x what I think the maximum feedrate for Z should be. The reason I don’t think this is related to your jittering is because Z does not change during the “cutting” moves, so the high feedrate should not have an impact.