I use something similar in my game, the way i do it, is by using several tilemaps.
So one tilemap are the terrain informations, meaning that this is where the map is actually drawn, stuff like grass, mountains, deserts, water etc.
Next there are a tilemap that holds road, rivers etc.
A collision tilemap that hold all informations about which tiles are impassable and how costly it is for a unit to move on a given tile.
There are some other tilemaps as well.
So what i can do, is simply use each tilemap to check certain things. For instant it is more costly to move in mountains than on grass. So ill check each tile during start of the game, and save these information to the collision tilemap. And then i just check for roads and if there are a road on a tile with mountain it will then use the road settings and not the mountain.
In my game, if i render the collision map it will look like this:
Now there are some tiles that are not added.... but the color goes from none to black, where red cost a lot, and black is impassable, such as water. So it works fine, and units prefer moving on roads, avoid mountains etc. And it gives a good amount of flexsability as you can add several different tiles on top of each other and just read the information from a given tilemap when you need it.