The original code is unfortunately split across various scripts, but the basic idea is:

I have a script for interactable objects with their interaction type saved as enum. if the interactable's type is "level", when the player interacts with it (i.e. has entered its collider and has pressed the interact button) it tells the signal bus to send the signal to change the level.
[this is not included here, because there's a lot of additional stuff going on in those scripts]

the level manager is responsible for managing the logic of the levels, including loading them, placing the player, and making sure all other scripts are doing the correct thing (this could also be implemented by the other scripts listening for the signal, something i'm only realizing now as i'm typing it.... there's a lot of optimization possibilities, that code is absolutely not perfect).

the level script just makes sure that every level has an initial player position, which is just a node2d placed somewhere in the level scene
