If you have a global useContext and/or/with useReducer then all components using that context will re render no matter if the part of the sate they use has changed or not, if you also have a handler that is not wrapped in useCallback then virtual DOM compare will fail and these component will cause DOM updates. You can have multiple small contexts but then you have multiple sources of your state (could be good or bad depending on your needs and implementation).
React could be used with your own observable and useSyncExternalStore that has parts of global store or just one state for all components. With selectors it would prevent components from re rendering that did not have changed state.
If you don't want to write your own observable then you can just use Redux and connect it to React with react-redux.