'My' aproach works best with large sectors. The sector's can be non-convex (unlike descent) if you render the sectors using z-buffering which is pretty standard today :-). I think this method is a very good for 'hardware accelerated' rendering because you minimize overdraw using portals, but use just a few (static and large) vertexbuffers for the sectors.
You can also project the vertices of a portal to screen coords and calculate the bounding square. When you draw the next sector you clip the bounding squares of the portals with the bounding square of the first portal. (see http://developer.infi.nl/reinder/portalengine_large.jpg).
This method is simple and works very well with 3d-acceleration (you can use scissors to clip to the bounding square), and I believe Doom III uses it. I wrote a demo using this technique (including sourcecode) you can find here: http://developer.infi.nl/index.php?ID=5
the .proc files contains the 'level' data (sectors and portals) and some pregenerated shadow volumes. The .cm file is used for collision detection. The level is rendered using a portal-based visibility algorithm. I wrote some demo's reading the .proc and .cm files, which you can download here: http://developer.infi.nl/index.php?ID=5 (source code included)