There aren't any "playback speed requirements". But it is playback behavior.
The difference is really that instead of "frame 1, frame 2, frame 3", there are only keys.
This means the runtime goes: "you should be this value by 1 second, and this value by 3 seconds. If the time 1.75376 seconds right now, calculate the appropriate value between those two".
Mobile is subject to the same 30 or 60fps behavior. (iOS lets you choose).
But more importantly, you'll still get those fractions of a second.
You could change some lines of code in SkeletonAnimation.cs to change this behavior.
But it wouldn't be standard behavior (and likely not as smooth-looking).
Let me check that other thing.
Judging from the code, you're actually playing 2 animations at once.
"StalkSpiral_Anim" animates the stalk on track 0.
"LeafSpiral_Anim" animates the leaf on track 1.
The thing you shouldn't be doing here is applying a slot image/attachment key for the leaf in the StalkSpiral animation.
If LeafSpiral enables it, and StalkSpiral disables it, there's a chance that leaf image will disappear until the next key.
Just remove the keys for the leaf in the StalkSpiral animation.
You can also change the Setup Pose so the leaf is disabled on setup, and the LeafSpiral animation can enable it itself when it wants to.
On one hand, I think this is a bit of a temporary bug.
But it's also good practice to separate those two animation "domains" that way:
StalkSpiral shouldn't touch the leaf animation. The LeafSpiral shouldn't touch the stalk animation.