I've tried quite a lot of different approaches to process the underlying DEM so that the generated contours don't contain spurious sinks. The approaches involved a mix of filters, and warping the DEM to double the resolution.
Of all of the approaches, there were two that gave reasonable results, so I'll post them for the benefit of others grappling with the same situation.
1. Minimum Filter
The simplest option is to run a 3x3 Minimum Filter over the DEM, and then generate contours. Whitebox Tools has a Minimum Filter (x=3,y=3). You could probably also use SAGA Rank Filter with a radius of 1 and a Rank of 0%.
This resolves the sink issue, but it does cause all of the new contours to be shifted some distance back from the original contours (new ones in pink vs original in orange)
2. Adjust Resolution and Rank Filter
This is similar to (1), but takes a slightly more sophisticated approach. It is more complex and time-consuming, but appears to give superior results.
- Adjust the resolution of the image to double the size. My DEM is 2m, so GDAL Warp with an output file resolution of 1 will do this.
- Apply a Rank Filter (SAGA -> Raster Filter -> Rank Filter) with radius 1 (ie 3x3) and threshold 33.
- Generate contours
This also appears to resolve the sink issue, and the contours are well aligned to the original ones. In the canyon area, they may in fact be a better representation than the ones I presented in the question! The main downsides are the extra processing step and extra processing power/memory required due to the larger DEM and the use of Rank Filter. (new ones in green vs original in orange)
The Minimum Filter method introduces a shift of the contours approximately the size of the DEM resolution (2m in my case).
The Adjust Resolution and Rank Filter method introduces a shift of the contours of about 0.5m on a 2m resolution DEM, though it ranges from about 0.1-0.8m.