>>Using Config::Tiny, and assuming you don't actually need it to be in %ENV, but you just want to treat them as internal "environment-style" variables, and also want to accept true environment variables
Your assumptions are mostly correct. Eventually I don't really need to use %ENV, but while I'm still using a mix of batch and Perl scripts I plan to keep using it.
I like this approach of using Config::Tiny to parse the ini and then do the substitutions in my code. I've had good luck with Config::Tiny before so I'm already familiar with it. I can let it handle validation and parsing.