It's surprising that most languages will happily let you do this. Lots of C programs have 'FOO' and 'foo'; not so many will have 'Foo' as well but it's probably more common than you think.
IMO this is only a problem if they both are the same type, e.g. both are a function, both are a type, both are a variable, both are a special keyword, things like that, because then it's hard to mix them up.
If however you can substitute one for the other in code and still have it compile, that would be terrible.
That's filesystems, not the OS. There are some extremely good reasons to treat filenames as bags of bytes, which is why Apple got rid of case folding in APFS. Think performance, locale issues, etc.
(And before someone says it, yes, of course performance matters for filenames. Every single stat shouldn't need to worry about case folding.)