There's good and bad in all three ways of doing it. Usually the VL/Ent functions perform around similar speeds, with the cmd stuff tending to run slower as each command first gets interpreted.
However, there's some instances when a command call makes a lot more sense and/or reduces the amount of work. One nice thing about using Ent/VL functions instead of command (other than speeds) is that you can make them work through ObjDBX on DWG files not currently open - this works a LOT faster than using a script to open multiple DWGs and modify them.
As for ent/vl, there are some cases where vl gives better results and does things more automatically (especially if things like dictionaries come to play). Others where ent gives better results (e.g. with extended data).
The VL stuff is actually just a wrapper over the ActiveX modules which used to be how people programmed using VBA. Lately (a few years ago) VB started to die down, but the ActiveX ties to ACad is still available, and thus the VL functions still have their uses. Unfortunately since ActiveX (and especially VBA) is a Microsoft-only product these are not available if running something like ACad for Mac - in that case you're stuck with only the CMD or Ent functions.
I have found though, that the ent functions give you greater access to raw data than the vl stuff. Especially asthe ActiveX libraries for ACad hasn't been updated in at least a decade. Meaning much of the newer tools / entity types aren't properly modifiable.
There's also a 4th set of functions which was introduced mainly due to ActiveX not getting updated and not available on Mac. The propertyvalue functions actually work on the same stuff as if you're programming in C++ through ObjectARX. In some cases these are a boon (able to get to stuff more easily than trying to work with RAW data through ent), but usually they're just an extra way of doing the same as you could using the ent functions. Unfortunately though these are only implemented for property get/set, for creation / deletion / copy / etc. you need one of the other sets instead.
Then of course there's the DotNet things too. Though only if the dotnet library being loaded implements a lisp function to open its methods to AutoLisp. In some cases this gives abilities which was either near impossible or very tedious. But again, these aren't available for Mac.