Hi, here are my thoughts on this Topic:
i would use paths but on every junction or crossing or alike i would cut the path and make independent segments. All this segements should be "joined" in some sort of junction-point. This will ultimatly give you a map of all connection of streets, this can be used as base of a a-star map. Where the junction-points are the nodes and the road segments are the node-connections. With this you can calculate pathes to every junction-point.
I think using raycasts as collision avoidance system isn'f feasable for a large scale citybuilder with hundreds of cars. If you realy want to have individual agents driving around you have to realy scale complexity down as this could kill your performance easily.
I would subdivide the segement pathes into points that can be occupied by an agent, blocking this point for any other agent. Same with traffic lights, those can block a point on the segment wich then cannot be accessed by a car anymore.
But you have to make a realy clever way to store those data. It has to be realy fast to access the appropiate points on the map. I wouldnt use object for every point on the segments because creating and accessing object in godot isn't that fast. It would be better to have some sort of structured packed arrays for all the info. They are realy fast and save substantial amount of memory.