I’ve spent a couple of weeks with this recently and after fixing a fix small issues (1, 2, 3), visibility of point labels works quite well now. The only limitation is that it only works with opaque surfaces (not with semitransparent surface or volume rendering). See for example the curve widget, with points marked, pickable, with correctly shown/hidden point labels:
Since we need to pick visible points, we determine markup point visibility using vtkSelectVisiblePoints and use it for both rendering and picking (otherwise display of 2D graphics such as labels would interfere with hardware picking of the point). See the implementation here.