To be honest it's not really a good option. Yes, it works for now, but it's another back door added by someone who didn't understand object orientation good enough.
By calling set_as_toplevel()
you are removing ALL influences of parent nodes on the bullet. Let's say you want to implement some kind of level switching animation, so when the player enters a door the whole screen should shrink and move away to the side (like the animations they use on TV for sports replays).
Thanks to the object oriented nature of Godot this is not much of a problem - the whole game is a scene and can be resized, moved, rotated etc.
Unfortunately your bullet won't be affected by that since you disabled ALL influence of parent nodes.
That's why it would be a better idea to just add the bullet as a child to the parent of the spawner.
If you need more control or just want an even cleaner solution you can add a signal that is emitted when a shot is fired that passes the new bullet as a parameter, so the scene that owns the spawner can decide which node should be the parent of the new bullet.
The example with the replay cam may not work very well in this case, but being able to spontaneously turn a scene into a subscene of a new larger scene is probably the biggest feature of Godot which enables you to come up with designs that would be a lot more awkward to build in other engines, so by training to build everything in a reuseable way it will become easier to be creative with the engine later.