pkg_version -c の作成したスクリプトを見てみました。
なるほど、これは不満だ。と思いました。

/usr/ports/MOVEDを見ていないのか、ruby -> ruby16
の変更や、最初に悩んだ >>53 libtoolとlibtool13の
違いも含まれていませんでした。

というわけで sysutils/portupgrade の仕組みを眺めた
のですが...

1) portsdbの中では /usr/ports/Tools/make_index を
呼んで /usr/ports/INDEX を再度作成している。
(なぜ?cvsup後にはINDEXも更新されているのでは?)
必要なら /usr/ports/INDEX から /usr/ports/INDEX.db
を更新する。INDEX.dbはINDEXをバイナリにして検索効率
を上げたもの。

2) pkgdbは、配置されているファイルとパッケージ名を対応
付けたハッシュと、パッケージとorigin(usr/ports/INDEX
のことか?)を対応付けたハッシュと、インストール済みの
パッケージ名を管理するためのツールである。
つまるところ pkg_info の出力と /usr/ports/INDEX から
/var/db/pkg/pkgdb.db を作るためのツール。(なのか?)

3) portupgrade は /var/db/pkg/pkgdb.db を見ながら
依存関係を解決しつつ(ついでに/usr/ports/MOVEDも解決
しつつ)、適切な更新をしてくれる。

という理解のしかたで良いのでしょうか?