We have one stack, but are creating different parts of the stack in dedicated extension methods to keep it maintainable. From the Stack constructor, we call those extension methods.
So far, our stacks are not extremely big, so this is good enough for us.
All our deployments are getting the output of Pulumi first, set variables based on that and the rest of the pipelines use those variables where needed.