This example is not too realistic and just narrows it down to the case where a job can be divided into isolated tasks with no shared data/state.
Often times threads need to update shared dict/list etc... With multiprocessing this cannot be done. You can use a Queue for this but it's horribly inefficient.
Generally speaking if you need performance and Python is not meeting the requirements then you are better off using another language.