Note: This used to be an 'update' in my question, but jafe rightly points out that this is more of an answer in substance.
I got the results back of 1000000 randomly-played games thanks to a small adjustment to itub's code. I've whipped up a basic plot to show the results.
But if you prefer the specific numbers, here's the printout:
Counter({'is_insufficient_material': 474230,
'can_claim_fifty_moves': 169123,
'can_claim_threefold_repetition': 149398,
'1-0': 75868,
'0-1': 75239,
'is_stalemate': 56142})
As promised in the comments on one of the answers, I was going to calculate a Wilson score interval with continuity correction. I wrote the following function in Python to accomplish that (Here is the gist).
And calling this function on the outcome counts where either white or black win, we have:
>>> print(wilson_cont(75868, 75239))
(0.4995569815292355, 0.5046054923932771)
This result, confirming some of the comments and answers below, is not significantly different from 50 %. As MaxW has pointed out in their answer, a similar calculation has been done on an even bigger sample that concluded that there was a statistically significant difference. One concern I have with all these calculations, mine and others, is that they become more sensitive to deviations as the sample size becomes larger. This means it is difficult to determine whether there's truly a difference using standard null hypothesis testing when our sample size becomes extremely large, but if we don't sample enough then our sample won't be representative enough. What this has illuminated to me is a form of conditional reasoning that if there is a difference, then it is extremely small in terms of effect size.
My thanks to everyone who has shown interest in this post, and contributed their reasoning, research, or code into it.