Uhm... when was reviewing this bug... initially I thought about to change it in a similar way than the proposed by Petr's patch, but finally decided to keep it that way for better readability. But agree that, in the long term, could be better to have it working as suggested. So +1 for that.
IMO, to keep it working in the 20% section is ok, because with current (solid) API is difficult to have those "orphan" instances anymore (in fact the original bug was about to make the clean as part of the upgrade process, only once, and not in cron). 
And then this:
- Also we should always try to use LEFT JOIN instead of "AND NOT EXISTS (SELECT..)" - the time difference can be in orders of magnitudes when dealing with large tables.
Don't agree at all!
I think they are 99.9% the same under all DBs, in fact NOT EXISTS will work better under some circumstances (not indexes in join column, for example). And it's far more readable.
Real differences happen with "AND NOT IN (SELECT)" because the IN clause is executed per-each record!
BUT NOT EXISTS is, as commented, perfect, IMO.
Ciao 
This cron job is actually in the code, but there was a problem in the query, along with the fact that blog posts have an itemtype of "blog" while they are saved in table "post".