I found this document that provides some pseudo-code that will probably help. I'll try porting it to Python tomorrow. The more I think about this problem though, the more complicated I realize it is. Sometimes, instead of unsupported points needing to move, the neighboring vertices may need to move. I think that depends on whether the normal vector points up or down.
Also, I can create a mesh where the normal of an unsupported vertex won't pass through the cones of the neighboring vertices. I'm pretty sure I need to check both edges and faces.
Still can't have vertices at localize minima, but beyond that, vertices that are above at least one neighbor are okay if any edge OR FACE is greater than some set configurable angle.
Here is a blend file with a sample object. The vertex in the middle of the cube (local minima) needs to be moved so there is no local minima and so that at least one connected edge is at least ~20 degrees from horizontal. The vertex at the center/top should be moved until at least one connected edge is more than ~20 degrees from horizontal too.
I found this document (Pages 10-15) that provides some pseudo-code that should help. Since I don't have any experience doing anything like this, I could really use some help. I can't copy/paste the pseudo code here because the pdf file shows spaces in between most of the letters. Ugh. I'm not sure the whole thing is required, but maybe?