This issue is more minor than it might sound from the title. (Maybe it's even "not a bug" but I want to check.)
Consider the signature 304402206b5c3b1c86748dcf328b9f3a65e10085afcf5d1af5b40970d8ce3a9355e06b5b0220cdbdc23e6d3618e47056fccc60c5f73d1a542186705197e5791e97f0e6582a3201 from transaction 70f7c15c6f62139cc41afa858894650344eda9975b46656d893ee59df8914a3d. This is a badly-encoded signature because there is an overflowing s value, but the parse_der_lax function that Core uses accepts it, and in fact it validates and the transaction passes.
However, our secp256k1_ecdsa_signature_parse_der "parses" the signature as one where the s value is 0, which then fails validation. (See secp256k1_der_parse_integer where on overflow we zero out the return value, then return success.) This means that a user trying to call parse_der then "falling back" to parse_der_lax will reject the signature. More generally, the API provides no way for users to determine whether a signature that fails to validate failed because it's actually a bad sig,,or becasue it violates the BIP66 rules.
Maybe this is a non-goal of the API (or maybe it's a goal but nobody wants to touch consensus code to fix it), but it feels weird to me that the existing parser sometimes "parses" a signature into something that doesn't resemble the original signature. At the very least we should document this.
See https://git.rust-bitcoin.org/rust-bitcoin/rust-secp256k1/issues/1010 (or don't, because that issue is pretty sloppy).