You can get some information from the Content Manager database directly, but using the Core Service API and the Event System as needed is a better approach in terms of official Support, community support, and upgrades.
The APIs are built to be backwards compatible whereas the Content Manager database structure isn't public, meaning it can change between versions, breaking any reporting scripts you make.
That being said, Miguel Miguelez shared some example scripts to describe an existing content model. This can be useful in an upgrade scan or to better understand how your schemas, templates, and content relate to each other.
For example, you might use the
PUBLICATION tables to get counts.
I solicited example reports in this question on Tridion StackExchange Meta: Example Tridion Reports. This can give you an idea of what types of reports might be interesting to your users as well as what's been done before or implemented.
I would still recommend starting with a Core Service client to look at your create, edit/update, and roll-back scenarios. Delete will indeed need Event System code or another solution to be able to report and that. For example, you could record deletes in a separate database or compare separate reports to show which items are no longer in the system.