Is there a reason why you call animation.Update()
manually?
That would cause it to do a double Time.deltaTime increment in AnimationState.
Also depending on where this code sits, there could be other update order problems.
A way to fix it might be:
var skeleton = animation.Skeleton;
var state = animation.state;
skeleton.SetToSetupPose(); // Pose the skeleton according to the setup pose in Spine.
state.SetAnimation(0, "animation", false); // Store the animation in AnimationState for playback
state.Apply(skeleton); // Pose the skeleton according to AnimationState's current state. This call is not necessary if you are assured that this code will execute before SkeletonAnimation.Update.
//... presumably, Unity will call SkeletonAnimation.LateUpdate(); after this, which translates the posed Spine skeleton object into the visible Unity mesh you see in-game.