How to straighten edges when subdivided?
In my opinion, without adding more geometry, the image you included in your question is about the best you're going to get.

Referring to this image,



the way I'd change the geometry is to make the loop cut shown by the black line I added within the selected area. Next, I'd delete the face only under the two sets of green edges. I'd select the remaining edge from this face, and subdivide the edge into five segments. Now, I'd move the vertices labeled with a "1", the end vertices of the loop cut located at the black line, and the two sets of new vertices in the two green lines, and move those to conform to the position of the reference image. Then I'd build new faces in at the end. The three (I know the upper green line might look like only two, but it's three) green edges, plus the existing edge to which they attach at each end are each intended to make a quad, as do the the two approximately parallel edges from each side, the remainder of the original edge, and the original edge parallel to the cut. 

To get the shading right, you may have to adjust the shading of the new geometry, and you may find additional geometry in this area provides a more satisfactory appearance than the two green-edged quads, but this illustrates the general principle.