First, for 3 companies it would be better if you can have three different nodes to run multichain. Running 3 nodes has 3 individual wallets i.e. one for each node and the balanced can be tracked efficiently. On the other hand if you use 1 node and use getnewaddress it would produce as many addresses but they are all associated with the same wallet.
Secondly, to make a transaction private between two companies I would recommend using streams functionality and create streams between those companies to make sure the other parties in the chain don't have access to contents in the created stream.
Check out the below link.