clFinish will wait for the *last* entity in the command queue to finish. clWaitForEvents might wait on one in the middle, such that you've enqueued 20 tasks and are waiting on the 10th. You're not going to have a pause while the device is waiting for you to give it more work because you already pre-batched work. You might also wait for events in multiple queues at once, although clearly enqueuing the last task in a queue to depend on tasks in other queues would achieve something similar.
I tend to teach people to always get in the habit of using events. If you want to use a low-level API like OpenCL it's worth using it properly and setting up task graphs as early as possible.
If you are not thoroughly marking tasks with events and exposing those, then clFinish is a convenient shortcut.