This has been discussed in many different (blog) posts.
Julia can compete with C, but neither Julia, nor C can compete with fine-tuned machine code “easily” (@stevengj’s post below as a counter example for Julia ), tailored to your CPU. I am talking e.g. about BLAS (just have a look at some kernels and hand-tuned assembler code for a bunch of CPU types https://github.com/xianyi/OpenBLAS/tree/develop/kernel which exploit all kinds of features of the architecture itself, including cache types/sizes, instruction sets etc.).
Such things are often referred to as “C libraries” but they’re not the same as “plain C libraries written in pure C”, which are basically as fast as native Julia, sometimes faster, sometimes slower. It depends on the compiler and the type stability.
This also means that it’s more important to compare Python+C vs. Julia+C, where Julia is a clear winner. I don’t think I have to discuss that further
There are unfortunately disadvantages, since you have yet another layer of dependency, which by nature adds more problems to the stack. I find myself fighting with PyCall
every other week just because I work with virtual environments in Python and sometimes even Conda (Forge whatsoever) and things get very tricky with PyCall. As long as you are using a single Python environment, most things are OK and predictable. But this is not what I experience in my daily work. I am btw. an experienced Python dev.
The advantage of using Julia and frameworks which are writtein Julia is simply the fact that you can tune every single piece of your application, deep down the rabbit hole without the need to write C or deal with glue code and bindings.
…but as said, there are plenty of discussions, so I’ll cut it off now, hope this gives you some insights.