I would simply add that relational structures are optimized for data capture -- getting data into the database. Joins only slow things down when getting data out. This suggests that many people are trying to use relational structures in ways that are not optimal.
Relational integrity (along with strong data typing and other constraints) reduces the amount of validation code that has to be written and maintained in the service layer.
Understanding what our tools are for and using them appropriately is the key to getting the most out of them.