I will mainly talk about the practical consequences and not go into the nitty gritty. By GPL compatible I mean that a GPL project can use your code (NOT you can use GPL code).
The MIT and BSD 2 clause licenses have similar requirements: keep the license file. The BSD 3 clause license adds a term to the BSD 2 that prevents someone from claiming false endorsement. These three licenses are compatible with GPLv2 and v3.
The Apache 2.0 license requires you to keep the license file, the NOTICE file if there is one, and show notice for modified files. It also addresses some patent-related issues, so companies use it a lot. It is compatible with GPLv3 but not v2 (due to the patent clauses).
There is also an old BSD license that has an clause related to advertising. Don't use it because it's not GPL compatible.
In practice, the ecosystem you are working with has a license that is used most often to begin with, and I would stick to that. For example, I would use MIT for Nodejs packages. If you are working on an application, some would recommend using the Apache 2.0 license because it covers patent issues.