To the best of my knowledge, all serious graph-based software implements some form of community subgraph detection, with different documented algorithms, such as these (from Mathematica):
myGraph = RandomGraph[WattsStrogatzGraphDistribution[30,
0.3 TreeGraph[
RandomInteger[#] \[UndirectedEdge] # + 1 & /@ Range[0, 3]];30]];
myMethods = {"Centrality", "Hierarchical", "Spectral", "CliquePercolation", "VertexMoving"};
Grid[{(CommunityGraphPlot[myGraph, FindGraphCommunities[myGraph,
Method -> #]] & /@ myMethods), myMethods}]