In addition to everything else noted in other answers, the main advantages of this approach are the important cost reductions achieved during development and maintenance, as well as significantly improved scalability of the development environment.
Consider the case where there is no intermediate language; You will need to develop and use a compiler for each supported language and each supported platform. Let's say you have the languages ββL1, L2, and L3 and the platforms P1, P2, and P3. This would mean that you would need to develop and use 9 different compilers: C1 (L1, P1), C2 (L1, P2), C3 (L1, P3), C4 (L2, P1), etc.
On the other hand, having an intermediate common language, I allow you to develop 3 compilers of the language C1 (L1, I), C2 (L2, I) and C3 (L3, I) and 3 for the platform C4 (I, P1), C5 (I , P2) and C6 (I, P3).
Obviously, the larger your supported language and platform base, the more significant the cost reduction will be.
It also gives you great flexibility in future additions to supported platforms or languages; any new L4 language will require the development of only one C (L4, I) compiler, and you immediately support all platforms for the price of one development. Conversely, if you have a new P4 platform, you only need to develop C (I, P4) and, bingo, you have L1, L2 and L3, all work on P4.
This is basically a winning situation.