Il n'y a rien de magique ici, vous obtenez l'erreur car la connexion que vous utilisez lors de l'insertion de CompanyAddress n'est pas celle que vous pensez.
C'est une nouvelle connexion. Lorsque l'insertion ComapnyPaymentInfo est exécutée, vous utilisez la connexion qui est déjà liée à votre transaction. Il est en attente de nouvelles commandes car vous avez attendu à l'étape précédente.
L'utilisation de Task.WhenAll() d'autre part essaiera d'utiliser plusieurs threads. Si une connexion est occupée à exécuter une commande, elle ne sera pas utilisée et une nouvelle sera créée.
N'oubliez pas que lorsque vous utilisez Transactions, vous n'avez qu'une seule connexion disponible, vous ne pouvez pas bénéficier du parallélisme.