I only have first-hand experience with the simplified pyacvd implementation and it is very robust. It works well for open surfaces or surfaces with holes, too.
Left: original surface (11.4k points). Right: pyacvd result (1k points).
Disconnected meshes are handled correctly:
Even works for a Klein bottle:
Complex meshes with non-manifold edges don’t seem to cause any problems either: