The Django PBKDF2 DoS was a result of a poor implementation of the algorithm, and doesn't really reflect a general issue with password hashing.
The algorithm is a bit like this:
digest = HMAC(key=password, data=salt)
derived_key = digest
for each iteration:
digest = HMAC(key=password, data=digest)
derived_key = xor(derived_key, digest)
return derived_key
You can see why this is going to scale badly with password size - each iteration you're hashing the entire password into the key for the HMAC, and since you might have many hundreds of thousands of iterations it adds up pretty fast - half a million iterations turns a 4k password into nearly 2GB of data to hash.
But an obvious optimization should also be apparent here -- turning the password into a HMAC key need only be done once:
hmac = HMAC_Init(key=password)
digest = HMAC_Calc(hmac, data=salt)
derived_key = digest
for each iteration:
digest = HMAC_Calc(hmac, data=digest)
derived_key = xor(derived_key, digest)
return derived_key
I believe Django ended up making this fix some time after the length restriction was added as a band-aid.
Password length does obviously have some small effect as the cost of hashing scales linearly with length, but given modern cryptographic hash functions run at hundreds to thousands of MB per second, stupidly long passwords are probably more of a network DoS issue than anything.