I was wondering why a soft fork cannot in principle divide the Bitcoin network as a hard fork can. I understand that a soft fork, by definition, involves only tightening the consensus rules, but the result will still be two different sets of consensus rules. If some nodes consider a block or transaction valid and others consider it invalid, a network divide should be possible regardless of which side's consensus rules are newer. The roles of each side in the division would simply be the reverse of the hard fork case.
I was wondering why a soft fork cannot in principle divide the Bitcoin network as a hard fork can.
A soft fork absolutely can divide the Bitcoin network, in principle, if you don't specify any other assumptions.
However, the relevant point that distinguishes soft and hard forks is that the network will always converge as long as a majority of the hashrate enforces the new rules.
The reason for this is that even when old miners would produce a block that violates the soft fork's rules, the new miners will not work on top of it. They will ignore such a block, and start working on a competing branch instead. As they have the majority, this competing branch will at some point overtake the old miners' branch. The backward compatibility of the softfork means that old miners at that point will switch over to the new branch, abandoning their own, as the new branch is longer and is valid to them. Through this, the fork is resolved, and the whole network ends up working on one chain again.
As you can see above, the remaining old miners will cause increased (temporary) forks in the chain. In order to avoid having these interfere with the security properties of the network, recent soft forks in Bitcoin have employed thresholds of 95% (measured in one way or another) of miner signalling - leaving at most 5% that may produce forks.
Soft forks cannot divide the network because they occur with miner consensus. For this to happen, miners signal that they are ready and will enforce the new rules after they activate by setting certain bits in their block version numbers. Once enough blocks signal readiness (with BIP 9, this is typically 1916 out of a 2016 block retarget period, so 95% of blocks), the new rules will activate.
A chain split does not occur because, in theory, no or few miners are running old nodes in order to produce invalid blocks. Those that are typically upgrade quickly anyways.
Hard forks can do a similar thing to prevent chain splits, however what hard forks are unable to do is to prevent old nodes (non-mining) from being forked off of the network. The backwards compatibility of soft forks allows old nodes to remain on the network following the activation of the fork.
Under a hard fork, new nodes think old-style blocks are invalid, and old nodes think new-style blocks are invalid. Thus if old nodes continue creating old blocks, we get a chain of old blocks, and a chain of new blocks. Each community thinks theirs is the one true blockchain.
Under a soft fork, new nodes think old-style blocks are invalid, but old nodes think both types of blocks are valid. New miners, which we assume are in the majority, will create a chain of new blocks only. Old miners may try to create old blocks within this chain, but since new miners won't accept those blocks, they'll get orphaned. The old nodes will think the old miners are just unlucky, and they'll continue to accept the longest chain of blocks which they consider valid. In the long run, since new miners are in the majority, this longest chain will in fact consist only of new blocks.
So in a soft fork, the old nodes will agree that the chain of new blocks is the one true blockchain, without having to be upgraded, simply by virtue of the fact that it will become longer than any chain containing old blocks.