This implementation is not paralyzing "for real", besides being a "catastrophe". Yes, you want to know how to calculate different fibonaccis in threads or parallel processes - the answer to this would be an example of threadpool or processpoll (hint, look at concurrent.futures) - but I will not touch that subject here.
What is not parallelizable is that you can not have fibo (10) without first calculating fibo (5) - even if your fibo function has fibo (n-1) and fibo (n-2) in separate threads / processes, will have to wait both ends. (and the catastrophe would be even worse - because threads and processes are MUCH heavier in terms of memory consumption than simple calls)
The implementation works great for educational purposes, up to 10 fibonacci - maybe up to 15 - but if you ask for a fibonacci of 40 in it, it will crash your computer. The 80's will probably hold the world's largest supercomputer.
This happens because you have two function calls within each fibonacci call.
Python, to call a function, creates in memory a new object of type "frame" - (along with an object for each local variable of the function, etc ... - in this case it will only be the variable 'n' - but being an integer in Python uses a good 30 bytes - but the frame has about 400 bytes).
Well, if you ask fibonacci of "3", this is the initial frame, plus the fibon frame (1), plus the fibon frame (2) - which in turn calls fibo (1) and fibo (0) - are 5 calls - now notice that if you ask for fibo (5) these calls will be to fibo (3), and another 7 calls to fibo (4)? That is, the number of function calls you make grows with the number squared "n" (what you call complexity O (n²)) - for example, if fibo (5) will use a 1000 bytes (2 * * 10), fibo (10) will already use 2 ** 20 bytes: 1 megabyte and fibo (30) a GB.
The solutions are: Use a cache decorator: functools.lru_cache
in your fibonacci - this will cause that for any already known value, the function returns immediately, without executing its body (and portano without two other calls) - that is, to calculate fibo (7), fibo (6) will be called once, but when fibo (5) is called, its value will already be known, and no new calls will be necessary to values 4, 3, 2, 1, 0 in the branch of (5).
But better still, leave the recursive example to understand recursion on the whiteboard, and write the function interactively - go away from the exponential form.