As the category names will never change over time, I assume that the first case --URL rewriting only without perceivable redirection-- is better in this situation as search engines would store and display the friendly url instead of the unfriendly one. Is this indeed the case?
Sim.
Concerning the internal links accross the site (i.e. anchors in pages), I assume that I should use PHP (or equivalent) to dynamically write their friendly URL version instead of the default unfriendly one, so that search engines won't index unfriendly URL.
Sim. Apenas link para o URL amigável / "bonito". A URL real / "feia" nunca é exposta a usuários, mecanismos de busca ou bots de qualquer tipo. A URL real / "feia" é totalmente interna ao seu aplicativo.
A única etapa adicional que você pode precisar fazer é se esse site é antigo e os URLs antigos / "feios" já foram indexados pelos mecanismos de pesquisa ou vinculados por sites externos. Nesse caso, você também teria que implementar redirecionamentos 301 externos da URL antiga / "feia" para a URL nova / "bonita" para preservar o SEO.
I assume it would be wise to mention in each page its friendly URL as canonical link
Sim, você pode fazer isso. Isso também garante que nenhum parâmetro de URL (incorreto) seja indexado.
Are above assumptions correct
Sim.