Some of the questions you ask should be answered by the structure of the data and not so much in terms of efficiency. For example, (1) whether or not you need multiple join criteria will depend on the relationship between tables. Best practice (and most efficient) would be a single foreign key for the join, but your data may not allow for that.
In terms of (2) joining versus blending, this thread gives some good detail (and is still relevant for version 8): Custom SQL vs Data blending - if all things are equal which will yield better performance?
I'm not sure what you mean by (3) "plain join". Defining referential integrity in the database can definitely help performance as it may allow for join culling.
Finally, (4) Tableau is going to join the tables exactly as you define the joins. The joining will work exactly as it would in a relational database -- so you might want to do a quick Google search on how joins work. For example, you might want to look at this: SQL Joins. It definitely doesn't seem right that 6 million records are turning into tens or hundreds of millions. Likely, your joins are not resulting in one-to-one matches.
I realize that most of this is very generic. If you are able to share some specifics such as the schema of your tables, I'd be happy to take a look.