1. You have to manually keep the PropTypes in sync with the type of props actually being passed to the function. But nothing makes you do that, and it's pretty easy to neglect them - your editor's not going to complain (at least, WebStorm doesn't) so the first you'll see of a mismatch is if you happen to get an error (not really an error, it doesn't stop your code from running) in the browser or in your tests.
2. They don't actually enforce anything. Sure, React will complain about a prop type mismatch when you call the function, but your code will still run, and then it's up to you to figure out whether the PropType definition is wrong, or whether the prop itself is wrong. Maybe only one usage of the component is passing in the wrong prop type, maybe only under a specific set of conditions, and it's easy enough to miss that in tests (your test data matches the PropType, but your actual API data that ends up being a prop doesn't match the PropType - eg your PropType is a number but the API returns a string and you didn't convert it to a number, now you have a error-warning in production. That's your fault, sure, but you get no help with it from the tooling).
3. They're not very expressive. eg I can't define the shape of an object being passed into my component, I can only tell React that it's some object.
4. PropTypes only work at the boundaries of components. What about my functions inside the components? Or my helper functions that aren't part of a component at all? PropTypes do nothing to help me be sure I'm passing the right data to those.
You are also correct to point out PropTypes offer no way of adding typing to component or utility functions. I've seldom seen errors arise from the lack of typing here, and if they do you'll usually discover them at runtime. However types as added documentation of function signatures would be nice.
I find this super useful in many of my projects, I hope it helps with some of yours!
You can use eslint to enforce the use of prop types, it'll read through your code and will give you a warning if you are using a prop without a corresponding prop types declaration, the rule is called react/prop-types
You can us PropTypes.shape and PropTypes.exact to define the shape of props that are objects, see https://www.npmjs.com/package/prop-types
Even though editors can give reasonable autocomplete for JS these days, I think there's a certain amount of trust and comfort that you lose, and I find it really nice to have little mistakes flagged right as I'm typing rather than when running the code (even when I have a fast iteration cycle).
I also greatly prefer TypeScript when trying to use code I've never seen before, whether that's code written by someone else on my team or third-party code. The types add an extra layer of explanation that's hard to convey in docs or function/variable names.
And as discussed separately, PropTypes is much better than nothing, but I think it has plenty of gaps, and I feel much more confident and comfortable in a codebase with full typechecking.
(I didn't downvote; I upvoted you since I think your post is a good contribution to the discussion.)