polylines and fillpoly differ in that one brushes/fills them, the other strokes/draws the outline.
drawContours has special machinery to handle a contours array plus hierarchy information.
yes, there appears to be little thought behind this proliferation. it could all be done by one function and some optional arguments. the API grew and I suspect these functions grew 20 years ago and won’t be deprecated any time soon… except if someone completely overhauls all the drawing in OpenCV, which would be nice.