Even though you can use these functions to achieve complementary results, the functions themselves are not complementary at all.
Calling detach() on a tensor returns a new tensor with the same value, device etc. The only difference is, that this tensor is not related to the previous computation graph at all (although it shares memory with the original tensor).
Adding a new param group has nothing to do with the computation graph at all, it only defines which parameters within a graph can be optimized by the optimizer.