A cubic-bezier easing describes how a value moves from start to end over a fixed time, such as 300 milliseconds with ease-out. It is predictable and supported everywhere, including plain CSS.
A spring describes a physical system instead. You set stiffness, damping and mass, and the value moves towards its target the way a weight on a spring would, with or without overshoot. The duration comes from the physics.
The practical difference is interruption. If a user taps again while a panel is opening, a bezier animation usually restarts from the current position with zero speed, which looks like a hitch. A spring starts from the current position and speed, so the motion bends smoothly towards the new target. The same applies when a user throws a card or sheet with a gesture: the spring continues with the speed of the finger.
Springs also feel natural with fewer decisions: one or two settings give a consistent feel across elements of different sizes.
Beziers still have a place. For opacity, colour and transitions that never get interrupted, a short ease-out is simpler and works in CSS without JavaScript. Many teams use springs for movement and beziers for fades.