I was reading "Polygon Mesh Processing" and in chapter 5 the authors present this little algorithm:
remesh(target edge length)
low = 4/5 * target edge length
high = 4/3 * target edge length
for i = 0 to 10 do
split long edges(high)
collapse short edges(low,high)
equalize valences()
tangential relaxation()
project to surface()
They provide pseudocode and explanations for all steps except the last one. I assume that the reprojection must be done using the input mesh as a reference. Do you use some kind of BVH, find the triangle closest to the point and project to the plane?