A big TileMap might be under-performant depending on how big is your map. Also, it would likely make it problematic to enter houses and dungeons. You could maybe use visibility tricks to show what you want, but I don't think that would be easy.
Your second idea sounds better to me. It's the approach I used on my top-down RPG test (which I haven't touched in almost a year, but will come back to it soon).
If you look at my project, you can see I used a "warper" scene, which consists in an Area2D to detect the player and a simple script with two exported variables: a target scene and a target warp, so you can instance the scene whenever you need it and edit this properties through the editor itself.
This warper script is just to detect the player. Then it sends the data to a singleton which manages to transition the scene and re-position the player at the correct target (which is a Position2D node). Note that the current scene is never changed, it just replaces the instanced level with another.
Depending on how big are your levels, you might want to do a smart loading to avoid hiccups when transitioning: preload all the scenes that can be reached through this one (and discard the rest) and repeat the process when warped. This is optimization though so it can wait until your project is bigger.