I think environments in Salt are supposed to be descendants of each other, with a heritage like Dev --> Test --> Prod.
Some pillars, like say an MTA (SMTP service) would be independent parallel setting. The dev pillar might always point to a localhost vagrant, and test might point to a special mail server that just puts all mail in one local mailbox regardless of address. Prod would stipulate a full blown Internet MTA. For this stuff, you would have devmail.sls, testmail.sls, and prodmail.sls pillar files.
Some pillars, like say somepackage-version, might stipulate a version peg for a package that your states will need to install. All minions would load the same somepackage.sls pillar file, but each would load it from the environment/git-version at that tag/branch.
Some stuff might be asserted the same everywhere, and stable enough to be everywhere, like maybe stuff for your local custom salt integration with your local non-salt tools specified in salt-extras.sls. Occasionally, you might need to override some of its pillars for sandbox environments, and you have chosen a pillar merge strategy carefully, so that you can load the same pillar.sls from base and environment where necessary.
BTW: I think a lot of people like to use the base environment as Prod, because it makes sense with the git branching workflow of merging features into the main branch as they become mature.
ergo... [my attempt at an illustrative example]
base:
'*':
- salt-extras.sls
prod:
'prod*':
- prodmail.sls
- somepackage.sls
test:
'test*':
- salt-extras.sls
- testmail.sls
- somepackage.sls