Thanks!
If you're really curious about the implementation details, the source code is all public on GitLab:
https://gitlab.com/snopek-games/portal-bug
Yes, there was a state machine for each of the actors: the player, as well as the plant and spider enemies. We didn't use an AnimationTree, just lots of animations on an AnimationPlayer, that were all triggered by the different states in the state machine.
The checkpoints are actually super simple! There's just a variable that gets set with the last checkpoint you crossed, and its position becomes the respawn point for the player. This works because the enemies in the stage respawn on a timer, so we don't need to save any sophisticated game state with the checkpoints.