Breaking/continuing out of multiple loops

Your logic is incredibly opaque here. Why does incomplete game data sometimes skip the entire league, but as long as you don’t get too much all at once, you’ll only skip individual seasons? This still feels extremely artificial, but I’ll give you the benefit of the doubt there; still, it does seem like there’s quite a few utterly unrelated things going on here (for instance, there are two places where you increment number_of_incomplete_game_data but they have different loop-skipping behaviour).

Like I very clearly said, it is based on my real-life example. I changed a lot of things because otherwise it would be too complex but in essence that’s what my problem is. If there is too much missing data of a certain type, I skip the table, player, season or league accordingly.

“welp, sometimes code is messy, deal with it”

If this were about a completely novel idea that had never been implemented in any language before, sure, I would agree that this could be such a case. However, labeled loops are nothing new. They have been implemented in several prominent, respected and successful programming languages without any adverse effects. If this is the case, it must be so for a reason. Maybe in the end it won’t be implemented in Python but the idea is very valid and solves a specific and real problem.

A 50-line loop body and eight levels of indentation (assuming this is inside a function) and this is the good version? Having a multi-break won’t didn’t fix that. All the complexity in that code stems from trying to do ad-hoc relational querying with imperative code, at the same time as pre- and post-processing. You should compute all the game stats up front unconditionally, filter out the ones you don’t want separately after the fact, and only then “do stuff”.
In very broad strokes, this is more like what I would expect that code to look like:

First of all, this is cheating as you did not at all replicate the behavior of the other script, you just changed the algorithm completely. More importantly, processing everything unconditionally is not even close to an acceptable solution in my use case. I am processing a lot of HTML in process_game_stats() and use a good deal of regex. To make matters worse, my files are in a very slow external hard drive in many different folders and so are glacially slow to scan. There are multiple dozen basketball leagues from different countries, some of which have over 5000 players, each of whom has played hundreds of games on average. Some, like Lebron James, have played over 1300. All in all, I am looking at literally millions of scraped HTML pages.

Again, like I said, even if I didn’t have a real use case, your proposed solution is also not a solution at all as you simply changed the whole algorithm in order to avoid replicating the behavior that I showed. How would you do the exact thing that I did, meaning control the flow of the program in that exact way using one of the proposed solutions in this thread or another of your own? In other words, how do you solve the loop flow problem without labeled loops?