1vanThe8ear You're doing the switch in the middle of the physics frame i.e. between two character's _physics_process() execution. From the perspective of the physics engine, this causes an overlap because one character's position is updated this frame while the other's is yet to be updated next frame. Since both characters are calling move_and_silde() and are setup to check/resolve collisions with each other, the engine tries to resolve this overlap and hence displaces the characters. To confuse things more, you're calling the swap from _process() while running _physics_process() at the same time.
First, eliminate _process() from the player script and put the code in _physics_process(), and second, defer the swap to after the physics frame has been fully processed:
func _physics_process(delta):
if Input.is_action_just_pressed("player_switch_places"):
call_deferred("SwitchPlaces")
# the rest of it
Btw you shouldn't have everything colliding on default layer 1. Instead, separate character/character and character/tiles collisions into different collision layers.