I don't think Sitecore specifically says not to combine any roles. From what I've read, they only highly discourage using a standalone (one-instance) environment in production. Separating some roles (such as CM and CD) is crucial. Keeping some other roles combined may not be such a bad idea.
As a matter of fact, the out-of-the-box server roles Sitecore provides are merely examples. Each role consists of several smaller features/subsystems, most of which can be disabled or moved to another server role—so you can actually invent your own server roles! The structure of Sitecore's configuration files was built with that in mind.
Below I'll give examples for two server roles that are most often candidates for combining with other roles.
In my experience, you only need a dedicated Reporting Server in two cases:
- Your xDB is hosted in the cloud, or in another similar setup, making the Collection database (MongoDB) and the Reporting database (SQL) unreachable directly. In this case, you'd host the Reporting Server in the same network with these databases, and make the Reporting Server directly available to your CM running reporting applications.
- Generation of reports may sometimes take a lot of CPU and memory, which would also justify using a dedicated Reporting Server.
Outside of these two cases, the CM server should be the one generating reports.
Depending on the amount of traffic your CD servers get, you may or may not need dedicated Processing Server(s). The crucial thing here is to monitor the CPU and memory consumption on all of your servers.
You can combine the Processing Server role with either:
- The CM role if it's not loaded by heavy content editing/publishing/etc.
- The CD role in case your CD servers are powerful enough (which should be a rare case).
If you monitor you server performance, you'll know when you need to scale out and separate your roles. On smaller sites, combining some server roles is a very reasonable thing to do, and I don't believe it contradicts any official recommendations by Sitecore.