I can't tell you explicitly what to do as this is a high level question, but if you are indeed new to game development, then I can give you some advice.
Consider using a component system
I'm biased here as I almost exclusively use the component system in my own project, but it really is a great design pattern. It very easily allows you to create very complex functionality. You'll need to research this yourself if you haven't heard of it before, but here is a link to get you started if not:
Decouple your scripting system from your C++ code as much as possible
This is somewhat related to using a component system. You're going to want to break your code into self contained units as much as possible, that will will eventually be referable from your python scripts.
If you implement your scripting system correctly, performance most likely won't be a problem
I'm treading on thin water here, but it needs to be said. If you're just making a simple game, then the performance penalty associated with using python or any other such interpreted language will not be a worry as long as you use it appropriately. What I mean by this is that your collision detection code etc should not be implemented using python. What you want to do is reference C++ code within your python files.
You will end up making extensive use of whatever event system you decide to implement, so don't overengineer it but make sure it is easy to maintain and consider what you actually need it to do. If necessary, get out some paper.
Honestly, don't worry about coding 'efficiently' to begin with. Just don't do anything silly like try to implement part of your rendering system in python, unless, of course, you can take that performance hit.
Get something working. You can very easily get bogged down in the specifics to begin with. What I would advise is to just get yourself to a scenario where you can confidently call functions from python, have that python script modify some of your internal object states in C++ and then see where you are.
Addressing your last point, multi-threading: optimise as and when you have to, not pre-emptively as you will waste time. If there are things you can do which will improve performance with little or no extra development time required then by all means do it, but generally, you will want to see whether you hit performance targets and then profile your code