It is not a bad practice.
From a point of view of a component, this.gameObject will always lead to a valid gameObject:
A component is always attached to a game object. - reference
That is, component cannot live without one. With GetComponent<Type>() there could be no component at all, so you should always check it or you could get crash caused by NullPointerReference.
The only bad practises about gameObject/transform/components getters are connected with using them heavily, multiple times on every update. Then you could consider some caching mechanism, for better performance results. See this question.
EDIT: It seems like caching gameObject shouldn't make any improvements, but there is a speed gain by caching components (and yes, transform is a component). However, this stuff was also slower in previous Unity releases.
There is some useful time measured data comparison: link.