Reverse purging - which is pretty much what your general procedure does - is a good alternative if you have to purge much of the data, much as in 90%+ of the data keeping just the remaining 10%- of it.

I wouldn't do #4... instead I would rename original table as *_old, rename temp table are the real deal then build indexes.