Bad: squashing commits that have been pushed. Very bad. Not just because it rewrites history but because it's going to cause headaches to other people.
Good: squashing commits in your own local branch before pushing to origin. In my opinion, this is not just good, it's excellent. Nobody on my team needs to know how many micro commits or dead ends and backtracks I've gone through before I reached the current shape of the code I'm about to push. I love squashing in this situation so I can rearrange and make the commit more pretty before it becomes public.
On top of that, I'd argue that this kind of commit squashing contributes to making better commit logs.
1. You can run `bzr log` on a git repository (with the bzr-git plugin). Hence it's a UI issue.
2. That operation still takes O(history size) time, because git repositories lack the necessary metadata to make the operation fast (hence: "largely" a UI issue).
You can get this, more or less, with the combination of using `git rebase` and `git merge --no-ff`.