CAN is really good, simple and easy to understand, but of course not the optimum solution for every job.
Compared to UART for example, you get:
* Multi-node bus
* Packaging of data with 8-byte payload PLUS a hardware level identifier which you can use to describe content / node id / whatever and which also doubles as a priority level.
CAN is optimum in cases where you flood relatively short data packets (but usually longer than 1 byte, so benefit from the packetization) from multiple sources and want to "subscribe" to them. There is no guarantee of getting packets through, and no usable form of acknowledgement, so most typically you just design the systems to have timeouts in case required data is not received in time. CAN itself is simple and low level, what you do with it and how is up to you.
Also CAN peripherals in microcontrollers are often very powerful, allowing built-in filtration (for example: ignore data not matching whatever ID) and whatnot, but the flip side is, there are quite a few registers to configure, and quite a few state charts to understand (e.g.: you have to enable configuration mode, then enable running mode, or whatever). For example, the CAN peripheral in STM32H7 series is quite complicated because it is so flexible, you have to configure the memory layout you want to use for it. It takes easily 1-2 full days to get started with it (compare to ½ hours of UART peripheral).
Luckily, you can see there are not too many CAN peripherals; not many MCU manufacturers did their own, but licensed something already made, so you can find the exact same CAN peripheral, with exact same documentation (maybe with different visual style) in MCUs of different companies.