Try CFrame.FromOrientation instead. Theres various constructor methods for CFrames regarding rotation and each one applies the rotations in a different order hence the discrepancy.
This is the only explanation I could up with for the meantime, I could be wrong but I suppose the orientation is applying first from x then y then z, so imagine moving a block with 0, 0, 0 orientation, first it sets x orientation to 90, so the parts orientation sets respective to its current orientation, that means that now its facing upward, you now change the z, which changes according to the parts orientation, so that its looking upward, and z axis is for front face and back face for part, that means its y axis is changing
Because you are using CFrame, it means that whatever you do to the CFrame, it changes respective to the part’s axis, not the world axis
As @red4erik said, one of those ways should help out.
I’m pretty sure you’re running into what’s called ‘gimbal lock’.
For a good explanation just google it.
Basically as @meet_theHAXER said, you’re rotating one axis exactly 90°, which now aligns it with one of the other axes. Now when you try to do anything else to either one of those axes it can mess with the other one instead.
If you use the Search tool up top try searching gimbal lock in the forums. There are quite a few posts that let you know how to fix it.