What is the best practice way to mass update records?

What is the best practice way to mass update records?

Use case: we have 500,000 Contacts with the wrong Owner. I need to go through each record, compare owner to another table of territory assignments, then update the Owner based on assignments. I found three solutions.

1. Zoho CRM custom function - major limitation. Can only update 10,000 records per day. Time to complete: 50 days.
2. ETL - download all the Contacts, use a local script/process to generate a new CSV file with updated date, import to Zoho CRM. Slight limitation. Can only do 30,000 records per CSV file, but no limit on number of files. Time to complete: 1 to 2 days
3. Mass Update - minimal limitation can only select 50,000 records at once. Use views in Contacts module to select many records, click Mass Update and change Owner. There are 70 territories, so I have to create 70 views. Time to complete: 1/2 to 1 day.

This seems backwards to me. The labor-intensive method is the fastest with no significant limitation. I can do this basically as fast as I can click. On the other hand, the programmatic method is the slowest. It is so slow that it essentially useless.

Similar use case: we have 100,000s of Contacts with missing address data. The data exists on the Account and just needs to be copied to the Contact. I have a Workflow that does this automatically on creation of new Contact. Limitation - Workflow only runs when number of records created is 1000 or less.

The same issue applies to this case. Programmatic solution is the slowest.

How do others approach these type of problems?