One other thing to think about is the compiled code you end up with. Specifically regarding things like disabling interrupts, compilers like the Arduino interface don't always (read 'never') end up with compiled code that is neat and tidy, i.e. with all the unused stuff tied down properly.
So I'd bottom out that you're actually running code that is doing exactly what you think it is. If you're using the Arduino tools, I guarantee you it won't be. There will likely also be janky interactions on things like the port controller and any DMAC hardware coming out of the hidden parts of the Arduino code that may cause activity on the interrupt controller.
From a signal integrity point of view, unless you're operating in the many tens of MHz, or have a PLL frequency well above 100Mhz, or overclocking the chip, you should be able to get the jitter down pretty low without doing anything particularly exotic. Just make sure traces are nice and short with no 90 degree bends atwixt the crystal and the osc pins.
Personally I'd say unless you've made a schoolboy error on the layout for the oscillator, then the problem is far more likely to be software related. Things like the Arduino tools are meant for hobbyists/students tinkering. They are most definitely not suitable for high end, timing critical applications. I cannot stress that point enough. You must explicitly switch off, or set to a known state, every single peripheral/output/interrupt or you will get issues. Even then, if you're using hobbyist tools, and regardless on some controllers, the order in which you do it can be important.
As a final point, I'd say make sure you've got your scope set up correctly. Although you may have identified it properly as jitter, you may be seeing (in the images above) artefact in the trigger when you capture the waveform. If you've got an infinite persistence feature on your scope, that's a better mode to use. (I'm a Techtronix guy, and don't know Rigol scopes well...)
Good luck.