true but the languages are siloed, each notebook runs just one language. with beaker the languages can communicate with each other. there's no easier way to combine python and javascript for d3, for example: https://pub.beakernotebook.com/publications/7fdcaaa6-fb83-11...
Not everyone needs more than one language in the same notebook communicating between each other. But if required, then the cell magic system looks superior to me: have a look at %%fortran, %%cython, %%javascript, %%html, %%bash options. Also it is possible to switch kernels in the same notebook, but serialization of state between kernels is handled by user.
Cell magics just seem like one possible method of choosing which language to use, a menu such as what beaker uses seems alright too.
I was setting up cling (the C++ kernel) today and I gave up at realising that the interpreter is spun up in a subprocess, rather than a kernel persisted across cells. Without cross cell support, mixing languages is a limited feature of jupyter.