Have you made sure that there is no buffering going on between your script and the client? Maybe the websocket channel has gzip compression enabled which buffers?
Have you written your progress output to a logfile in parallel to verify that your script arrives at the respective steps when you think it should?
Your problem seems to be relatively common, but the only one with enough source code to maybe reproduce it (and a solution) was at Mojolicious websocket with server-side repeating events. So maybe you can either try that solution or work your code into something that we can run to try and reproduce your problem.
Relevant keywords seem to be perl mojo websocket flush, but without seeing more of your code, it's hard to judge whether the solutions (or not) suggested fit your situation.