1) Touching the database directly is never good. The results in terms of data might seem to be the same but the truth is that some events are missed. For instance, after removing the values with an SQL query you will not have the points automatically calculated as that is something that PHP does.
The best way to solve step 1 would need to execute PHP code. There are a couple of alternatives but if, as you mentioned, there are a small amount of questions in that state then it might be better to do it manually rather than writing PHP code.
For the sake of completeness, the full approach would involve writing a similar SQL to the one you've linked that would fetch the IDs of all questions with best answers selected and then pass all those IDs through this magic function.
2) You're right. However, you should consider that also users who select the best answers will also have their points affected (unless you've set that setting to 0). Also note that I would perform this step before the previous one or at least making sure you have the tuple: user_who_selected_answer, user_who_got_answer_selected and post_id. That way you can later figure out how points will be affected and perform the corresponding update later (maybe an Excel file would help, depending on the amount of users and questions)
3) That's perfectly fine
This is a core hack so there isn't much testing on this. So I can't be 100% sure you won't need an additional change in the future, including CSS. However, at first sight, you shouldn't as what you are changing (the commented code) is the one that avoids adding the CSS classes and the generation of the HTML code in the theme. So you shouldn't need any additional change in front end. Anyway, if something goes wrong or looks bad you can always ask for support :)