I don't know much about proc gen, but here's my quick and dirty solution: keep the same approach as for trees and houses, and add "road markers" or some type of invisible "road" object. Once generation is done, iterate over those road markers and try and link them based on proximity and sightlines.
# before that, collect all of the markers into the road_markers array
var road_graph =  # list of edges
var start = road_markers.pos
var end = road_markers.pos
for marker in road_markers.slice(2, road_markers.size()):
if marker.pos.distance_to(start) < marker.pos.distance_to(end):
start = marker.pos
end = marker.pos
then iterate through the list of edges and build your road from there:
for road_segment in road_graph:
create_road(road_segment, road_segment) # takes a start and end position
You'll need to decide what to do with objects intersecting with the road, whether one takes prevalence over the other (or just decide randomly).
The resulting road network could look quite wonky though. My approach to building the graph is pretty stupid, but it's a start.
create_road method, I'd try and simply stretch a simple cube from the start to the end, just to see how the roads look. You'll need to either divide the road into smaller segments that more closely fit the terrain, or raise/lower the terrain to accommodate the road.