For the older vocabulary of Japanese, we have native "Yamato" terms and borrowed Sino-Japanese terms. For these, gemination as spelled with the small-tsu っ historically only happened with voiceless obstruents. The analogue for geminate voiced obstruents in Japanese was prenasalization, which we do see -- although it is realized as //ɴ// + [following consonant]
, not always strictly as gemination. Consider 度【たんび】 (northern dialect for たび), まんま (emphasized / dialectal form of まま), etc.
However, with the influx of foreign words, we've started to see contrastive gemination of some voiced obstruents -- compare バグ ("bug") versus バッグ ("bag"), 反吐【へど】 ("vomit") versus ヘッド ("head"), レジ ("[cash] register") versus レッジ ("ledge"), etc.
That said, even with borrowings of terms that are generally realized as ending in voiced geminates (like キッド and ベッド and ドッグ), there has been a tendency to devoice, resulting in as-spoken realizations like キット and ベット and ドック.
As for why Japanese vocabulary trends tend to eschew geminate voiced obstruents, I suspect it may have more to do with the fact that the language has apparently included mora timing for the entirety of its historical existence (i.e. since it was first written down).
Within that phonetic context, certain sounds seem to be easier to distinguish: the brief pause before a geminate voiceless obstruent, or the added mora of an ん, is easier to hear. One hint is to consider how words sound when sung. See also https://en.wikipedia.org/wiki/Japanese_phonology#Gemination.