The explains can be hairy at first but once you've started systematically analysing a query and know some of the quirks of the MySQL query planner you'll manage to identify missing indices and squeeze out very, very good performance.
That was a database where we had warm tables bigger than fifty million rows. I personally migrated it from single instance MySQL 5 to a MySQL 8 clustered rig and optimised hundreds of queries written by people learning basics on the job, going from horrifying to very reasonable latencies as seen from the web clients.
Admittedly I'm mostly using MSSQL, but joining multiple tables seems a pretty natural thing to do (assuming you are joining on well indexed tables).
This is specific to the default MyISAM engine, where it locks all tables used in a query for the duration of the query. So two queries that touch the same table can't run concurrently.
You may never hit this as a problem if your queries are fast enough, but it is something to be aware of.
InnoDB uses row-level locks, so it's extremely unlikely to cause such issues.
The only issue is joining with aggregations and sorting, that's where things get ugly with MySQL.
It seems excessive at first but the performance is so dramatically better that it makes a lot of sense. Especially if the queries are part of your hot path. I always thought of it like having core business logic tables, then utility tables which are essentially derived from those core tables.
Check in on your databases periodically, and refresh your memory. There's a very real chance they've picked up features that'll make your life a lot easier.
Joining the tables in the database should perform better than joining them on the application layer. If it doesn't, there's something very odd.
This holds for any production ready DBMS. Even the ones that don't care about performance or preserving your data.
But wrong is almost always odd, so the normal expectation is that you understand the oddity on your system. Otherwise you are blind to problems.
Anyway, it's also not common for an application to have "reduce total CPU usage" as a goal. Available CPU on the database is way more valuable than on the application server, and so it makes sense to trade them up.