data = {{2, 60}, {4.5, 62}, {6.5, 64}, {8, 65}, {9, 65}, {10,
65}, {11, 65}, {12, 67}, {13, 67}, {14, 67}, {16, 67}, {17,
67}, {18, 67}, {19, 65}, {20, 64}, {21, 70}, {22, 75}, {23,
80}, {24, 80}, {25, 82}, {26, 82}, {27, 79}, {30, 80}};
I will present a few variations and hopefully the readers can decide what works best for their needs.
Using built in ColorData:
This is a starting point. It colors the line using the specified gradient scheme from start to finish.
ListLinePlot[data,
ColorFunction -> Function[{x, y}, ColorData["Rainbow"][x]]]

User defined color function with continuous change:
To color continuously in three user-defined colors from start to finish:
cf1[x_] := Blend[{Red, Blue, Green}, x];
ListLinePlot[data, ColorFunction -> (cf1[#1] &)]

User defined color function with arbitrary boundaries:
To color in discrete steps, define a ColorFunction using If. Here the cut off points are arbitrarily chosen as 8 and 15 for color boundaries.
cf2[x_] := If[x <= 8, Red, If[8 < x < 15, Blue, Darker@Green]]
ListLinePlot[data
, ColorFunction -> (cf2[#1] &)
, ColorFunctionScaling -> False
, GridLines -> {{8, 15}, None}
, GridLinesStyle -> {{Gray, Dashed}, None}
]

Instead of a mere color change, if data has to be partitioned and presented as such, it needs to be overlapped by one data point for it to appear continuous. e.g.
dnewOverlap = Partition[data, UpTo[9], 8]
ListLinePlot[dnewOverlap]
or
ListLinePlot[dnewOverlap, PlotStyle -> {Red, Blue, Darker@Green}]

Interested readers can add the option Mesh -> All to all plots to see the results.