This is a great question, I had to do something similar recently but with a much smaller dataset, so I was able to use a simple intersection with some extra visual quality checking and it was fine.
But here's an idea for this, though I don't have code, and it's kind of a hefty process. Definitely test with a sample from the full dataset first. You can probably some useful code around here. (The indentation got a little weird below.):
take the good geometry set (where you want to have the attributes end up) and create a buffer of it*
iterate through each of the buffer features:
2a. calculate the general orientation of the feature (max_y - min_y / max_x - min_x or something like that)
2b. make a select by location query on the other layer using this single feature
you'll have more than one feature that matches the select by location query, so iterate through these selected features and calculate the orientation of each one
get the attributes from whichever feature has an orientation closest to that of the buffer feature.
*I would start with a very small distance (one map unit or something) and then run this process with increasing distances, being careful not to overwrite any attributes that you have already transferred.
**You could actually probably forgo making the buffer features, and just do the select by location query with a buffer distance in it. I'm not very familiar with QGIS, but I'm sure you'd be able to do that.
There is no way that this will work perfectly for all your features, but it's a start, and then it just comes down to developing a good QA/QC strategy for checking and completing the transfer.
EDIT Thinking about this more, here is a basic example that would completely break the system if you were starting with a very small buffer distance and choosing the feature with the best matched orientation as I recommended:

The attributes from the wrong red line would be taken. To avoid this, you may want to create some sort of tolerance, and only take feature's attributes if its orientation (when compared to the orientation of the original blue feature) falls within that tolerance.
EDIT 2 Oops, are these polygons? I guess I just assumed they were lines on a grey background. If they are polygons, I don't really know if this orientation concept is a good one. But you could select all intersecting features, and figure out which has the most overlap (run a Union-type tool, and then use the polygon with the largest area...).