Just for future reference for anyone has this problem, I didn't end up using signals, I just had the global load function return the variables (in a dictionary, though an array would also work), then had the GUI pause menu script that called it convert them into individual variables and call the level-local load function to put them where they belonged.
This is probably not the right way to do this, but that's kind of this game's motto at this point, so at least it's on brand.
var dict= Global_Save_Load.load_game() #this one's the autorun
var flexible_save=dict["flexible_save"] #this has all my NPCs' locations on paths, etc
$"../.."/Save_Load.load_game(flexible_save, pos_x, pos_y) #this one's local to the level/instance
The way the level changing code works is to load new instances from the files, so the levels aren't ever really in the same editor tab as the autoruns. I had trouble figuring out paths, and setting up the signals was difficult because the autoruns couldn't see everything else, even though the local files can call on them. Bouncing all those values back through the pause menu seemed like the most efficient way to get the values from the global save function to the level-local one.
I only used a dictionary because I was troubleshooting an issue with the player's position and didn't want to worry I was doing something wrong with the order of values in the array.