If you use Freestyle, one of its parameters is 'Crease Angle'.
If you set that high in Freestyle's general settings, and one of the discriminants for the Line Set is Edge Type > Crease, then Freestyle will pick up edges between faces where the internal angle between them is below the given threshold.
There is a 'Face Smoothness' checkbox for the Crease Angle. If it is unchecked, it will use the angle between face-normals in the underlying geometry. If checked, it will use the normals as interpolated by the smooth shading algorithm...
...hereabove, with 'Face Smoothness' checked. The left cylinder is flat-shaded, and the right cylinder smooth-shaded, with Autosmooth set to split out its caps.
There is also a Crease Angle modifier available for attributes of the Line Style. So you can, for example, vary the color of the line, depending on the angle between the faces it separates:
You can always render out Freestyle as a separate pass, to composite with other components as you choose.