Hi Kyu,
Remember, canonical is only a suggestion to google of which page should be delivering the content - it is still up to them what they do. In practice though, this is what many opt for.
301's are a permanent redirect and too many can suggest a poor underlying site - you wouldn't want a 301 for every page if there were a lot of them.
You could also think about Robots to remove some of the duplicated pages so they never get spidered, or just no-index them.
404's for me wouldn't be the ideal scenario because somewhere in the site, it can lead to what is basically a dead page. Too many 404's can actually harm your ranking because when Google spiders and finds them, if you have a large enough site, they could be met with 200+ dead pages!
On some sites, you are able to just remove the pages altogether, but you can't do this with the likes of Joomla.
Think about no-indexing / robots because although the pages will still be there, you are telling Google not to bother. This is the route many SEO's are taking now.
Andy