The case where you need to use calculated fields is when you want to translate data in multiple languages. Due to the fact that you only retrieve the value of the same language as the user it does not suffer from the performance hit. See the post about multi lingual environments in the forum on how to set up your domain model.
Otherwise you have to think calculated fields really trough because indeed recalculation 2.000.000 rows of data each time you show a grid is not a good sollution.
I must admit that I have been taught the same about calculated variables, and until recently I believed it blindly. However, I found that Mendix has made a number of improvements that diminishes the impact of some disadvantages.
For example, calculated attributes seem to be calculated only if they are really needed i.e. they are displayed to the user or are used in a MF. (probably there are exceptions to this) but it is definitely not the case that they are recalculated all the time when you do an operation on the object.
I completely agree with your remark that the alternative is sometimes too error prone as you try to catch all the places where the calculated attribute needs to be recalculated. This can lead to either unnecessary recalculations, or forgetting to recalculate when it is really needed.
All in all, I think calculated attributes are not as bad as we all believe them to be. That being said, the calculations should be lightweight. I personally avoid DB retrieves in calculated attributes.
Those are my personal thoughts, I would love to hear what other users think about calculated attributes.