Generics are fine. The main issues are that they are not cross-language and a larger module may have a large number of untested configurations, and possible issues with some build flows.
Basically, VHDL allows more complex generics/ports that don't translate into Verilog. If the code is used in a mixed environment, the ports/generics should make sense for both VHDL/Verilog.
The second is an issue because often it will seem like a problem can be solved simply by incrementing a generic. If the developer never tested for this, then you might uncover unexpected behavior. This is problematic if the developers do not add in assertions for valid configurations as well as valid ranges.
Finally, if the generics are part of a larger module but do not affect port sizes, it is possible to use a version of the netlist that has different generics than the HDL. (for me, I had a project with multiple large modules that were synthesized to netlists in a previous build step. That build step set the generics for the core based on info in a makefile. The port sizes were the same. The result was a design where the implementation did not match the RTL.)