If the question is “which is best”, then the question follows, “for exactly what”.
All the mentioned tools are “best”, but on different operations.
For example, I use Rhino to automagically load messy meshes (with say 10000 stray mesh splinters) and only a few objects (most often only two) which I want to keep and further refine. I’m using GrassHopper for this. Gain: an endless number of manual steps are eliminated.
I then automagically export the roughly “pre-cleaned” mesh to disk (.obj) and open it in OpenFlipper or MeshMixer (or Instant Meshes) to remesh (isotropically) and close holes.
If MeshLab Server hadn’t be so buggy (it often crashes when executing from commandline from whithin Rhino/GH) I would perform all my cleaning and remeshing from within GrassHopper (I have a component for this). Thus no other manual interaction would be needed, other than importing the mesh to Rhino while my dedicated “CleanMeshes” GH definition is open. I’d then lean back and wait until finnished. Unfortunately MeshLab Server crashes, though, so I have to do these steps manually. For now at least.
But as said, different tools are “best” for different operations involved in cleaning, which are numerous (just look in the manues of MeshLab the you see how many mesh repair operations there really is. Apart from all the segementation strategies (which is a major thing in mesh preparation from point clouds, like from CT scans and MRI etc)
Depending on your problem, try the tools I mentioned and run FIRST remeshing (Isotropic in OpenMesher, Traingulated in Instant Meshes, Remesh (with specific edge length) in MeshMixer and se what happens. SOmetimes it is better to close holes before remshing, sometimes not (depending on how bad the mesh is).
All these commands in different order and combination is a n^2 thing. This is why you have to try, try, try.
The quality of your mesh most often determines what is a “good” tool and what is a “bad” tool for the task needed.