Hello -
As Jorg mentioned it is bad practice to have any Thread.sleep() calls in your workflow processes - this will cause workflow threads to be stalled, and if many of these thread.sleep() calls occur simultaneously you could be effectively stopping workflow processing completely.
The correct approach here is to use an ExternalProcessStep [0] to wait until the correct time to execute your process step. You can either execute your code in the execute method if you do not need to wait (return null) or execute your code in the "hasFinished" or "handleResult" methods if you must wait for other workflows to finish.
Also, I wouldn't worry about having multiple workflows running for the same payload - this is typically fine - what you want to avoid (and we have hooks for in the system as Jorg mentioned) is to have the same workflow model running for the same payload. In this case it seems it's different workflow models which are running.
Hope this helps,
Will
[0] https://docs.adobe.com/docs/en/aem/6-2/develop/ref/javadoc/com/adobe/granite/workflow/exec/WorkflowExternalProcess.html