**1)** Try this:

    public static double calculateLengthAlongLineString(LineString theLine, Coordinate coordinateOnTheLine){
    	GeometryFactory factory = new GeometryFactory();
    	double length = 0;
    	// create point to check for intersection with line
    	Point pointOnTheLine = factory.createPoint(coordinateOnTheLine);
    	Coordinate[] theLineCoordinates = theLine.getCoordinates();
    	// iterate over linestring and create sub-lines for each coordinate pair
    	for(int i = 1; i < theLineCoordinates.length; i++){
    		LineString currentLine = factory.createLineString(new Coordinate[]{theLineCoordinates[i-1], theLineCoordinates[i]});
    		// check if coordinateOnTheLine is on currentLine
    		if(currentLine.intersects(pointOnTheLine)){
    			// create new currentLine with coordinateOnTheLine as endpoint and calculate length
    			currentLine = factory.createLineString(new Coordinate[]{theLineCoordinates[i-1], coordinateOnTheLine});
    			length += currentLine.getLength();
    			// return result length
    			return length;
    		}
    		length += currentLine.getLength();
    	}
    	// coordinate was not on the line -> return length of complete linestring...
    	return length;
    }

This approach is similar to what you already suggested. In this approach I do not replace any coordinates before calculating the length. Each LineString segment is checked for intersection with the point (coordinate) and then the length is summed up.

**2)**

Not to my knowledge.