The other issue is companies that don't distribute software. Google's modified Linux that runs their datacentres, for example, is never distributed and so they never had to share their changes. I've worked with companies that use GPL'd software in this way but won't admit to it publicly for fear of liability (even though they're completely compliant with the license, as far as I can tell), and so who won't send patches upstream. Meanwhile, the same teams will happily send bug fixes for BSDL'd libraries that they use, because there's no chance that they're infringing the license and so they're happy to admit to using it.
People are not used to the GPL, don't know how it works, and then don't use the GPL. This is at first a problem of the people not educate themselves about the GPL. The license itself is clear: Yes, you distribute the original code or your derivative work upstream, as long as the people you distribute to can enjoy the same freedoms you had when you got the original code. It's quite simple.
And this is the real difference between BSD and GPL: as long as the people you distribute to can enjoy the same freedoms. BSD doesn't have a provision like this. BSD allows you to take away freedoms you enjoyed. Some people argue this would somehow be more free.