You can also add text labels using custom Arrowheads:
ClearAll[arrowHeads, labeledArrows] arrowHeads[lbls_, offset_: 2, size_: .04] := Arrowheads[{-size, {Automatic, Automatic, Graphics @ Text[#, {0, 0}, {0, offset}]}, size}] & /@ lbls; labeledArrows[lbls_, lst_, offset_: 2, size_: .04] := MapThread[ List, {arrowHeads[lbls, offset, size], Arrow /@ Partition[lst, 2, 1]}];
Examples:
labels = {"region 1", "region 2", "region 3"}; list = Thread[{{0, .29, .75, 1}, -.25}]; Plot[{.5 x^2 + 1, x + .75, 2 x}, {x, 0, 1}, PlotRangePadding -> 0, PlotRangeClipping -> False, ImagePadding -> {{Automatic, Automatic}, {Scaled[.05], Scaled[.03]}}, GridLines -> {{.292893, .75}, None}, Epilog -> labeledArrows[labels, list]]

You can add styling directives and use the third and fourth arguments to control the label position and the size of the arrow glyph, respectively:
Plot[{.5 x^2 + 1, x + .75, 2 x}, {x, 0, 1}, PlotRangePadding -> 0, PlotRangeClipping -> False, ImagePadding -> {{Automatic, Automatic}, {Scaled[.05], Scaled[.03]}}, GridLines -> {{.292893, .75}, None}, Epilog -> {{labeledArrows[labels, list], Dashed, labeledArrows[{"region 4"}, {{.29, 2 .29 - .1}, {.75, 2 .75 - .1}}], Dotted, Red, FontColor -> Purple, FontSize -> 12, labeledArrows[{"label 1", "label 2", "label 3"}, Thread[{{0, .29, .75, 1}, 2.1}], -1, .06]}}]

Update: An alternative way to use labeledArrows is to generate a graphics object and use Grid to show it under the main plot. (Note the use of special settings for ImageSize, PlotRangePadding and ImagePadding to align the two graphics objects):
options = {ImageSize -> 1 -> 400, PlotRangePadding -> 0, ImagePadding -> {{Automatic, 10}, {Automatic, Automatic}}}; plot = Plot[{.5 x^2 + 1, x + .75, 2 x}, {x, 0, 1}, GridLines -> {{.292893, .75}, None}, Evaluate @ options]; arrowsandlabels = Graphics[labeledArrows[labels, Thread[{{0, .29, .75, 1}, 0}]], PlotRange -> {{0, 1}, {-.05, 0.01}}, Evaluate @ options]; Grid[{{plot}, {arrowsandlabels}}, Alignment -> Right, Spacings -> {None, 1}]
